package com.xiaoshuidi.cloud.module.contract.service.contract;

import com.alibaba.fastjson.JSONObject;
import com.xiaoshuidi.cloud.framework.common.pojo.CommonResult;
import com.xiaoshuidi.cloud.framework.common.pojo.PageParam;
import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.OrderResp;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.rentOrder.RentOrderCountVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.rentOrder.RentOrderVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.*;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company.CompanyContractSonPageReqVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company.CompanyRoomListExcelVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company.CompanySonsContractListExcelVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.ownerContract.ChangeHousekeepReqVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.settlement.SettlementDetailBaseVO;
import com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.RenterCheckRespVO;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractRoomDO;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.SettlementDO;
import com.xiaoshuidi.cloud.module.contract.service.contract.dto.ContractRoomQueryParamDTO;
import com.xiaoshuidi.cloud.module.contract.service.contract.dto.ContractSettlementDTO;
import com.xiaoshuidi.cloud.module.contract.service.contract.dto.ContractStatusDTO;
import com.xiaoshuidi.cloud.module.contract.vo.ContractRoomReqVO;
import com.xiaoshuidi.cloud.module.contract.vo.ContractRoomRespVO;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;

/**
 * 租客合同 Service 接口
 *
 * @author 合房租赁
 */
public interface ContractRoomService {

    /**
     * 创建租客合同
     *
     * @param createReqVO 创建信息
     */
    void createContractBill(ContractCreateReqVO createReqVO);

    /**
     * 创建租客合同-续租
     */
    void createRenewalContractBill(ContractRenewalReqVO createReqVO);

    /**
     * 创建租客合同-换房
     */
    void createExchangeContractBill(ContractExchangeReqVO createReqVO);

    /**
     * 租客合同-退租
     */
    void createRefund(ContractRefundReqVO reqVO, Boolean flag);

    /**
     * 创建租客合同
     *
     * @param createReqVO 创建信息
     * @param node        合同节点 新签  | 续约 | 退租 | 换房
     * @return 编号
     */
    ContractRoomDO create(ContractCreateReqVO createReqVO, String node);

    /**
     * 更新租客合同
     *
     * @param updateReqVO 更新信息
     */
    void update(ContractUpdateReqVO updateReqVO);

    void update(ContractUpdateStatusVO updateReqVO);

    /**
     * 删除租客合同
     *
     * @param id 编号
     */
    void delete(Long id);

    /**
     * 获得租客合同
     *
     * @param id 编号
     * @return 租客合同
     */
    ContractRoomDO get(Long id);

    /**
     * 获得租客合同列表
     *
     * @param ids 编号
     * @return 租客合同列表
     */
    List<ContractRoomDO> getList(Collection<Long> ids);


    List<ContractTenantInformationRepVO> getRentDataByContractId(Long id);

    /**
     * 租客合同列表条件查询
     *
     * @param pageReqVO 创建信息
     * @return 编号
     */
    ContractRoomListRespVO pageCompanyContractSon(CompanyContractSonPageReqVO pageReqVO);

    /**
     * 租客合同列表条件查询
     *
     * @param pageReqVO 创建信息
     * @return 编号
     */
    List<CompanySonsContractListExcelVO> getContractList(CompanyContractSonPageReqVO pageReqVO);

    /**
     * 根据房间id获取当前合同
     *
     * @param id 房间编号
     * @return 当前房间合同
     */
    RoomContractRespVO getRoomContract(Long id);

    /**
     * 根据传参类型获取续租合同、历史合同、已经删除合同的对应的列表
     *
     * @param roomId           房间编号
     * @param roomContractType 合同类型
     * @return 当前房间合同
     */
    List<RoomContractListVO> getRoomContractListByRoomContractType(Long roomId, Integer roomContractType);

    /**
     * 获得租客合同
     *
     * @param id 合同id
     * @return 租客合同
     */
    RoomContractRespVO getById(Long id);

    List<ContractRoomDO> selectActiveCompanyContract(Long companyContractId);

    /**
     * 通过企业用户id获取生效中的房间列表
     *
     * @param customerCompanyId
     * @return
     */
    List<CompanyRoomListExcelVO> selectByCustomerCompanyId(Long customerCompanyId);

    /**
     * 客户手机号 和合同状态查询 租客合同
     */
    List<ContractRoomRespVO> getContractPhone(String phone, List<String> contractStatus);

    /**
     * app 租客合同查询
     */
    PageResult<ContractRoomRespVO> getCustomerContract(PageParam pageParam, Long memberId);

    /**
     * 通过房间id获取所有合同
     *
     * @param roomId
     * @return
     */
    List<ContractRoomDO> getContractByRoomId(Long roomId);

    /**
     * 入住交房
     */
    void delivery(Long id);

    RentOrderCountVO contractCount(Long id);

    /**
     * 更新租客基础信息
     */
    void updateTenantInformation(ContractFoundationReqVO reqVO);

    void updateContractInformation(ContractInformationReqVO reqVO);

    List<ContractRoomReqVO> getRoomIdByUserId(Long loginUserId);

    ContractStatusDTO setStatus(Long apartmentId, String contractSort, String node,String customerType);

    void updateRoomStatus(Long roomId, String node, Boolean flag, String contractStatus, String customerName, String customerPhone, Long id, LocalDate endTime);

    /**
     * 根据状态查询合同信息
     *
     * @param param
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractRoomDO>
     */
    List<ContractRoomDO> getContractByStatus(ContractRoomStatusQueryReqVO param);

    void updateStatusAndElectronicNo(ContractUpdateStatusVO updateReqVO);

    /**
     * 抽取合同退租逻辑 企业合同退租复用
     *
     * @return
     */
    ContractSettlementDTO handleSettlemendDetail(ContractRefundReqVO reqVO, Boolean flag);

    void createCheckoutSettlementRentOrder(
            ContractRoomDO contract,
            SettlementDO settlementDO,
            List<SettlementDetailBaseVO> detail);

    /**
     * 新增结算及结算明细
     */
    void generateSettlement(SettlementDO settlementDO, List<SettlementDetailBaseVO> settlementVos);

    /**
     * 个人客户 - 合同列表
     *
     * @param req
     * @return
     */
    PageResult<MemberContractResp> memberContract(MemberContractReq req);

    /**
     * 按条件查询租客合同
     * @param param
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractRoomDO>
     */
    List<ContractRoomDO> getRoomContractListByParam(ContractRoomQueryParamDTO param);

    /**
     * 批量更新合同已失效状态并修改房源状态
     * @param list
     * @return: void
     */
    void updateBatchExpireAndChangeRoomStatus(List<ContractRoomDO> list);

    /**
     * 查询企业合同下面已生效和待入住的合同个数
     * @return
     */
    int countNormalContractByCompanyContractId(Long contractId);

    ContractRoomDO getContractRoom(Long id, LocalDate time);

    void approve(Long contractId, String contractNode, ContractStatusDTO contractStatusDTO, ContractRoomDO contractRoomDO);

    ContractRoomDO getByFromId(Long id);

    /**
     * 根据memberId获取历史有效账单
     * @param memberId
     * @return
     */
    List<ContractRoomDO> getHistoryEffectiveContractByMemberId(Long memberId);

    RoomContractVO getContract(HomeQueryVO req);

    void sendNewSignSystemEvent(ContractRoomDO contract);

    List<ContractRoomDO> selectListByTimeAndStatus(LocalDateTime monthDate,List<String> statusList);

    /**
     *  首期账单未支付合同
     * @param param
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractRoomDO>
     */
    List<ContractRoomDO> getFirstOrderUnpaidContractList(ContractRoomQueryParamDTO param);

    void cancelSigning(Long id);

    /**
     * 校验租客信息（待签约合同，待支付账单，待签署安全协议，待处理交房）
     * @param
     * @return: com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.RenterCheckRespVO
     */
    RenterCheckRespVO checkRenterInfo(Long memberNo);

    void createBill(RentOrderVO rentOrderVO, OrderResp orderResp);

    void member();

    /**
     * 回滚原合同状态
     * @param roomContractList
     * @return: void
     */
    void rollbackOriginContract(List<ContractRoomDO> roomContractList);

    /**
     * 换房处理原合同结束，释放原房态
     * @param contractId
     * @param node
     * @return: void
     */
    void dealOldContract(Long contractId, String node);

    List<ContractRoomDO> getContractByRoomIds(List<Long> roomIds);


    /**
     * 处理自动生效合同
     * @param contractRoomDO
     * @return: void
     */
    void dealAutoEffect(ContractRoomDO contractRoomDO, LocalDate time);

    void updateMemberUser(Long userId, String mobile, String userName, Long oldUserId);


    /**
     * 判断分散式房源房间可录入合同
     * @param roomIds
     * @return: java.lang.Boolean
     * true 可以录入
     * false 不可录入
     */
    Boolean checkDisperseRoomEnterContract(List<Long> roomIds,LocalDate ...localDates);

    List<ContractRoomDO> getRoomIdsByMemberId(Long oldUserId);

    /**
     * 找出逾期合同
     * @return
     */
    List<ContractRoomDO> selectOverdue();

    ContractRoomDO selectExtensionContract(Long contractId);

    Boolean changeHousekeep(ChangeHousekeepReqVO reqVO);


    Boolean changeRoomApproval(Long userId,
                            Long storeManager,
                            Long otherStoreManager,
                            String changeType);

     void redInvocie(LocalDate evictionTime, List<Long> longs);

    CommonResult<JSONObject> salesStatement(ContractSalesStatementVO vo);

}
